#ifndef _MAIN_H_
#define _MAIN_H_
#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "sys/types.h"
#include "sys/socket.h"
#include "fcntl.h"
#include "pthread.h"
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "sys/select.h"
#include "asm-generic/socket.h"
#include <sys/stat.h>        
#include <termios.h>    
#include <errno.h>
#include <math.h>
#include "sys/ioctl.h"
#include <linux/input.h>

#include "rkmedia_api.h"
#include "sample_common.h"
#include "rkmedia_api.h"
#include "rkmedia_venc.h"

#define SERVER_IP "121.199.72.103"
#define SERVER_PORT 33333

#define GPS_SERVER_PORT 8888

enum XYD_HELMET_CMD{
	XYD_MSG_ERROR,//消息校验失败,
	XYD_MSG_VIDEO,//视频数据
	XYD_MSG_AUIDO,//音频数据
	XYD_VIDEO_STOP,//停止视频传输
	XYD_VIDEO_START,//开始视频传输
	XYD_AUIDO_STOP,//停止传输音频数据
	XYD_AUIDO_START,//开始音频数据传输
	XYD_MSG_CLIENT,//客户端的ID合法校验
	XYD_MSG_TERMINAL,//终端ID合法校验
	XYD_MSG_CLIENT_ERR,//客户端ID不合法
	XYD_MSG_TERMINAL_ERR,//终端ID不合法
    XYD_MSG_CLIENTID_TERMINAL_UP,//服务器发给终端的在线ID
    XYD_MSG_CLIENTID_TERMINAL_DOWN,
};

//安全帽传输协议信息
typedef struct helmet_message_str
{
    enum XYD_HELMET_CMD command;//命令
    uint32_t device_id;//设备ID
    uint32_t audio_device_id;
    uint32_t tmp2;
    uint8_t * data_ptr;//数据指针
    uint32_t tmp1;
    uint32_t data_length;//数据长度
    uint32_t sum;//和校验
    char xyd[8];//信盈达标志
}HELMET_MSG;

//安全帽信息
struct helmet_info {
    int sockfd;//套接子
    uint32_t device_id;//设备ID
    char * self_ip;//开发板IP
    uint16_t self_port;//开发板端口号
    bool video_net_status;//摄像头上传标志位   true 上传  false 不上传
    bool auido_net_status;//音频上传标志位     true 上传  false 不上传
    pthread_t net_pd;//接受线程ID
    pthread_t gps_pd;//gps线程ID
    pthread_t mpu6050_pd;//mpu6050线程ID
    pthread_t ctl_pd;//mpu6050线程ID
};

char *video_node;               //视频节点名字
int pwd_fd,beep_fd,key_fd;      //使用到的文件描述符

char ai_node[16],ao_node[16];   //音频输入节点名，音频输出节点名
int blance_flag;              //跌倒标志
int gps_skd;	            //用于GPS服务器通信

extern struct helmet_info h_info;
void Init_Sys(void);
int Init_MyNetWork(void);
void Init_Muxter(void);
void Init_MyCamera(void);
void Init_Audio(void);

bool sum_test(HELMET_MSG msg);
uint32_t sum_value(HELMET_MSG msg);
int mysock_read(int sockfd,void * data,int size);
int mysock_write(int sockfd,void * data,int size);
void Recv_Audio_data(HELMET_MSG msg);

void *pthread_gps_read(void * arg);
void *pthread_mpu6050_read(void * arg);
void *pthread_ctl(void * arg);
void get_av_node(void);
int gps_server_connect(void);

#endif
